package com.wjm.api.ReflectPackage;

import java.lang.reflect.Field;

/**
 * Data:2022年07月30日
 * Author:wjm
 * Content: Reflect发射机制（对成员变量进行操作）
 *
 *
 *  获取成员变量的方法：
 *          1）Field[] getFields()    获取所有public修饰的成员变量
 *          2）Field getField(String name)    获取指定名称的public修饰的成员变量
 *          3）Field[] getDeclaredFields()    获取所有的成员变量，不考虑修饰符权限
 *          4）Field getDeclaredField(String name)    获取指定的成员变量，不考虑修饰符权限
 *
 *  属性的常用方法：
 *          1）void set(Object obj,Object value)    设置属性值，第一个参数为对象，第二个参数为属性值（只有public修饰的属性能用）
 *          2）Object get(Object obj)    获取属性的值，返回值类型为Object类型（只有public修饰的属性能用）
 *          3）setAccessible(true)    忽略属性的访问权限修饰符的安全检查，即将private变成public（暴力反射）
 *
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //首先要先获取Class对象
        Class c = Class.forName("com.wjm.api.ReflectPackage.Car");

        //获取public修饰的成员变量数组
        Field[] fields1 = c.getFields();

        System.out.println("数组长度为"+fields1.length);
        for (Field f:fields1){
            System.out.println(f);
        }

        //获取指定名称的public修饰的成员变量
        Field money = c.getField("money");
        System.out.println(money);
        System.out.println("--------------------------------");

        //获取所有成员变量数组
        Field[] fields2 = c.getDeclaredFields();

        System.out.println("数组长度为"+fields2.length);
        for (Field f:fields2){
            System.out.println(f);
        }

        //获取指定名称的成员变量，不考虑权限修饰符
        Field cid = c.getDeclaredField("cid");
        Field name = c.getDeclaredField("name");
        System.out.println(cid);
        System.out.println(name);
        System.out.println("----------------------------------");


        //创建一个Car对象
        Car car = new Car();

        //重新获取指定属性
        Field name1 = c.getDeclaredField("name");
        Field cid1 = c.getDeclaredField("cid");
        Field money1 = c.getField("money");

        //忽略属性的访问权限修饰符的安全检查，即将private变成public
        cid1.setAccessible(true);
        name1.setAccessible(true);

        //设置属性的值
        name1.set(car,"布加迪威龙");
        cid1.set(car,9999);
        money.set(car,100000.01);

        System.out.println(car);



    }
}
